'use strict'

const http = require('http'),
        fs = require('fs');

/*--------------------------------解析body数据---------------------------------*/

/*
*Content-Disposition:form-data;name="file";filename="xxx"
*Content-Type:text/plain
*
*@param {string} headerData
*
*/
function parseBodyHeaders(headerData){
    let hlist = headerData.split('\r\n').filter(p=>p.length>0)

    //解析content-disposotion=>hlist[0]
    //用;分隔，从第二个元素开始的数组
    let csplit = hlist[0].split(';').slice(1)

    let filename
    let name
    for(let a of csplit){
        if(a.indexOf('filename') === 0){
            filename = a.substring(a.indexOf('=')+2,a.length-1)
        }else{
            name = a.substring(a.indexOf('=')+2,a.length-1)
        }
    }
    let headers = {}
    let ind = 0
    let k
    for(let h of hlist){
        ind = h.indexOf(':')
        k = h.substring(0,ind).toLowerCase()
        headers[k] = h.substring(ind+1).trim()
    }

    return {
        filename,
        name,
        headers,
        contentType:headers['content-type'] || ''
    }
    //let contentType = 

}

function parseBody(bodyData,headers){
    let ctype = headers['content-type']

    let bdy = ctype.substring(ctype.indexOf('=')+1)

    let crlf_bdy = `\r\n--${bdy}`
    //连续\r\n\r\n的位置，一定是headerData结束位置
    let header_end_index = bodyData.indexOf('\r\n\r\n',
                                        crlf_bdy.length);

    let headerData = bodyData.toString('utf8',
                                        crlf_bdy.length,
                                        header_end_index);

    //解析文件头信息
    let hd = parseBodyHeaders(headerData)

    let file = {
        start:header_end_index+4,
        end:bodyData.indexOf(crlf_bdy,header_end_index),
        ...hd
    }

    file.length = file.end - file.start

    return file


}


/*--------------------------------解析body数据  END--------------------------*/






/*
.jpg .jpeg -> image/ipeg
.png -> image/png
.gif -> image/gif
.ico -> image/x-icon
.txt ->text/plain
.json -> text/json or application/json
.xml -> text/xml or application/xml
*/
let html = `
<!DOCTYPE html>
<html>
    <head>
        <title>FIRST HTTP</title>
    </head>
    <body>
        HELLO
    </body>
</html>
`

let routerTable = {

    GET:{   
         '/': async (request, response) => {
        response.setHeader('content-type',
            'text/html;charset=utf-8')
        response.end(html)

    },
    '/test': async (request,response)=>{
        let status = parseInt(Math.random() * 200)+199
        response.statusCode = status
        response.end('test end')
    },
    '/upload':async(request,response)=>{
        let stm = fs.createReadStream('./upload.html')
        stm.pipe(response,{end:false});
        stm.on('end',()=>{
            response.end()
        })
    },

    },

    POST:{

        '/data': async (request, response) => {
            let bufferList = [1]
            let bufferLength = 0
            request.on('data', chunk => {
                bufferLength += chunk.length
                bufferList.push(chunk)
            })
            let bodyData = null;
            request.on('end', () => {
                if (bufferList.length > 0) {
                    bodyData = Buffer.concat(bufferList, bufferLength)
                    bufferList = []
                }

                let file = parseBody(bodyData,request.headers)

                console.log(file);

                if (bodyData) {
                    response.end(bodyData)
                } else {
                    response.end()
                }
            })
        
        }
    }
    }



http.createServer((request, response) => {


 
    // console.log(request);
    // response.end('ok')

    //解析
    // response.setHeader('content-type',
    // 'text/html;charset=utf-8')
    //纯文本显示
    // response.setHeader('content-type',
    // 'text/plain;charset=utf-8')
    // response.end(html);


    if(!routerTable[ request.url ]){

        let rm = routerTable[request.method]

        if(!rm || !rm[request.url]){
            response.statusCode = 404
            response.end('page not found')
            return
        }

        rm[request.url](request,response)
    }
    //routerTable[ request.url ](request,response)
}).listen(3456)